package cn.xiaonezha.middleware.redis.reflect;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.HashMap;

public class XRedisFactoryBean<T> implements FactoryBean<T> {

    private Class<T> mapperInterface;

    @Autowired
    private Jedis jedis;

    public XRedisFactoryBean(Class<T> mapperInterface) {
        this.mapperInterface = mapperInterface;
    }

    @Override
    public T getObject() throws Exception {
        InvocationHandler handler = (proxy, method, args) -> {
            String name = method.getName();
            // 根据key获取
            if ("get".equals(name)) {
                return jedis.srandmember(args[0].toString());
            }
            // 新增key-value
            if ("set".equals(name)) {
                return jedis.sadd(args[0].toString(), args[1].toString());
            }
            // 根据key删除
            if ("del".equals(name)){
                return jedis.del(args[0].toString());
            }
            // 增加数据项并设置有效时间（秒）
            if ("setex".equals(name)){
                return jedis.setex(args[0].toString(),Integer.valueOf(args[1].toString()),args[2].toString());
            }
            // 清空数据
            if ("flushDB".equals(name)){
                return jedis.flushDB();
            }
            // 判断某个键是否存在
            if ("exists".equals(name)){
                return jedis.exists(args[0].toString());
            }
            // 不覆盖增加数据项（key重复则不插入）
            if ("setnx".equals(name)){
                return jedis.setnx(args[0].toString(),args[1].toString());
            }
            // 获取所有匹配的key
            if ("keys".equals(name)){
                return jedis.keys(args[0].toString());
            }
            // 设置键为key数据项的过期时间为seconds秒
            if ("expire".equals(name)){
                return jedis.expire(args[0].toString(),Integer.valueOf(args[1].toString()));
            }
            // 移除键为key数据项的生存时间限制
            if ("persist".equals(name)){
                return jedis.persist(args[0].toString());
            }
            // 关闭释放Jedis连接，回归连接池
            jedis.close();

            return "Redis执行"+name+"操作！";
        };
        return (T) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{mapperInterface}, handler);
    }

    @Override
    public Class<?> getObjectType() {
        return mapperInterface;
    }
}